﻿public enum CardType
{
	UnkownCardType,
	Action,
	PoliticalAction,
	Ally,
	Equipment,
	Retainer,
	ActionModifier,
	Reaction,
	Combat,
	Reflex,
	Event,
	Burnable,
	Flight,
	Vampire,
	Imbued
}

public enum Discipline
{
	UnknownDiscipline,
	Abombwe,
	Animalism,
	Auspex,
	Celerity,
	Chimerstry,
	Daimoinon,
	Dementation,
	Dominate,
	Fortitude,
	Melpominee,
	Mytherceria,
	Necromancy,
	Obeah,
	Obfuscate,
	Obtenbration,
	Potence,
	Presence,
	Protean,
	Quietus,
	Sanguinus,
	Serpentis,
	Spiritus,
	Temporis,
	Thanatosis,
	Thaumaturgy,
	Valeren,
	Vicissitude,
	Visceratika,
	SuperiorAbombwe,
	SuperiorAnimalism,
	SuperiorAuspex,
	SuperiorCelerity,
	SuperiorChimerstry,
	SuperiorDaimoinon,
	SuperiorDementation,
	SuperiorDominate,
	SuperiorFortitude,
	SuperiorMelpominee,
	SuperiorMytherceria,
	SuperiorNecromancy,
	SuperiorObeah,
	SuperiorObfuscate,
	SuperiorObtenbration,
	SuperiorPotence,
	SuperiorPresence,
	SuperiorProtean,
	SuperiorQuietus,
	SuperiorSanguinus,
	SuperiorSerpentis,
	SuperiorSpiritus,
	SuperiorTemporis,
	SuperiorThanatosis,
	SuperiorThaumaturgy,
	SuperiorValeren,
	SuperiorVicissitude,
	SuperiorVisceratika
}

public enum Clan
{
	UnknownClan,
	//Camarilla
	Brujah,
	Malkavian,
	Nosferatu,
	Toreador,
	Tremere,
	Ventrue,
	Caitiff,
	//Sabbat
	Lasombra,
	Tzimisce,
	BrujahAntitribu,
	GangrelAntitribu,
	MalkavianAntitribu,
	NosferatuAntitribu,
	ToreadorAntitribu,
	TremereAntitribu,
	VentrueAntitribu,
	Pander,
	Ahrimane,
	BloodBrothers,
	HarbingersOfSkulls,
	Kiasyd,
	SalubriAntitribu,
	//Laibon
	Akunanse,
	Guruhi,
	Ishtarri,
	Osebo,
	//Independents
	Gangrel,
	Assamite,
	FollowersOfSet,
	Giovanni,
	Ravnos,
	Abomination,
	Baali,
	DaughtersOfCacophony,
	Gargoyle,
	Nagaraja,
	Salubri,
	Samedi,
	TrueBrujah
}

public enum ReleaseSet
{
	UnkownReleaseSet,
	AH,
	Anarchs,
	BH,
	BL,
	CE,
	DS,
	FN,
	Gehenna,
	Jyhad,
	KMW,
	LoB,
	LotN,
	NoR,
	Promo,
	Sabbat,
	SoC,
	SW,
	Tenth,
	Third,
	TR,
	VTES
}

public enum Title
{
	NoTitle,
	//Camarilla Titles
	Primogen,
	Prince,
	Justicar,
	InnerCircle,
	//Sabbat Titles
	Bishop,
	Archbishop,
	Cardinal,
	Regent,
	Priscus,
	//Independent Titles
	OneVote,
	TwoVotes,
	ThreeVotes,
	Baron,
	//Laibon Titles
	Magaji
}

public static class VampireEnumUtils
{
	public static CardType GetCardType( string card_type )
	{
		switch ( card_type )
		{
			case "Action": return CardType.Action;
			case "Political Action": return CardType.PoliticalAction;
			case "Ally": return CardType.Ally;
			case "Equipment": return CardType.Equipment;
			case "Retainer": return CardType.Retainer;
			case "Action Modifier": return CardType.ActionModifier;
			case "Reaction": return CardType.Reaction;
			case "Combat": return CardType.Combat;
			case "Reflex": return CardType.Reflex;
			case "Event": return CardType.Event;
			case "Burnable": return CardType.Burnable;
			case "Flight": return CardType.Flight;
			case "Vampire": return CardType.Vampire;
			case "Imbued": return CardType.Imbued;
			default: return CardType.UnkownCardType;
		}
	}

	public static Discipline GetDiscipline( string discipline )
	{
		switch ( discipline )
		{
			case "abo": return Discipline.Abombwe;
			case "ani": return Discipline.Animalism;
			case "aus": return Discipline.Auspex;
			case "cel": return Discipline.Celerity;
			case "chi": return Discipline.Chimerstry;
			case "dai": return Discipline.Daimoinon;
			case "dem": return Discipline.Dementation;
			case "dom": return Discipline.Dominate;
			case "for": return Discipline.Fortitude;
			case "mel": return Discipline.Melpominee;
			case "myt": return Discipline.Mytherceria;
			case "nec": return Discipline.Necromancy;
			case "obe": return Discipline.Obeah;
			case "obf": return Discipline.Obfuscate;
			case "obt": return Discipline.Obtenbration;
			case "pot": return Discipline.Potence;
			case "pre": return Discipline.Presence;
			case "pro": return Discipline.Protean;
			case "qui": return Discipline.Quietus;
			case "san": return Discipline.Sanguinus;
			case "ser": return Discipline.Serpentis;
			case "spi": return Discipline.Spiritus;
			case "tem": return Discipline.Temporis;
			case "thn": return Discipline.Thanatosis;
			case "tha": return Discipline.Thaumaturgy;
			case "val": return Discipline.Valeren;
			case "vic": return Discipline.Vicissitude;
			case "vis": return Discipline.Visceratika;
			case "ABO": return Discipline.SuperiorAbombwe;
			case "ANI": return Discipline.SuperiorAnimalism;
			case "AUS": return Discipline.SuperiorAuspex;
			case "CEL": return Discipline.SuperiorCelerity;
			case "CHI": return Discipline.SuperiorChimerstry;
			case "DAI": return Discipline.SuperiorDaimoinon;
			case "DEM": return Discipline.SuperiorDementation;
			case "DOM": return Discipline.SuperiorDominate;
			case "FOR": return Discipline.SuperiorFortitude;
			case "MEL": return Discipline.SuperiorMelpominee;
			case "MYT": return Discipline.SuperiorMytherceria;
			case "NEC": return Discipline.SuperiorNecromancy;
			case "OBE": return Discipline.SuperiorObeah;
			case "OBF": return Discipline.SuperiorObfuscate;
			case "OBT": return Discipline.SuperiorObtenbration;
			case "POT": return Discipline.SuperiorPotence;
			case "PRE": return Discipline.SuperiorPresence;
			case "PRO": return Discipline.SuperiorProtean;
			case "QUI": return Discipline.SuperiorQuietus;
			case "SAN": return Discipline.SuperiorSanguinus;
			case "SER": return Discipline.SuperiorSerpentis;
			case "SPI": return Discipline.SuperiorSpiritus;
			case "TEM": return Discipline.SuperiorTemporis;
			case "THN": return Discipline.SuperiorThanatosis;
			case "THA": return Discipline.SuperiorThaumaturgy;
			case "VAL": return Discipline.SuperiorValeren;
			case "VIC": return Discipline.SuperiorVicissitude;
			case "VIS": return Discipline.SuperiorVisceratika;
			default: return Discipline.UnknownDiscipline;
		}

	}

	// TODO: Add a ClanUtils class with some helpers to indicate which Clan family a clan belongs to (e.g. bool IsSabbat(Clan) etc.) - or maybe change Clan to a class instead of an enum
	public static Clan GetClan( string clan )
	{
		switch ( clan )
		{
			//Camarilla
			case "Brujah": return Clan.Brujah;
			case "Malkavian": return Clan.Malkavian;
			case "Nosferatu": return Clan.Nosferatu;
			case "Toreador": return Clan.Toreador;
			case "Tremere": return Clan.Tremere;
			case "Ventrue": return Clan.Ventrue;
			case "Caitiff": return Clan.Caitiff;
			//Sabbat
			case "Lasombra": return Clan.Lasombra;
			case "Tzimisce": return Clan.Tzimisce;
			case "Brujah antitribu": return Clan.BrujahAntitribu;
			case "Gangrel antitribu": return Clan.GangrelAntitribu;
			case "Malkavian antitribu": return Clan.MalkavianAntitribu;
			case "Nosferatu antitribu": return Clan.NosferatuAntitribu;
			case "Toreador antitribu": return Clan.ToreadorAntitribu;
			case "Tremere antitribu": return Clan.TremereAntitribu;
			case "Ventrue antitribu": return Clan.VentrueAntitribu;
			case "Pander": return Clan.Pander;
			case "Ahrimane": return Clan.Ahrimane;
			case "Blood Brothers": return Clan.BloodBrothers;
			case "Harbingers of Skulls": return Clan.HarbingersOfSkulls;
			case "Kiasyd": return Clan.Kiasyd;
			case "Salubri antitribu": return Clan.SalubriAntitribu;
			//Laibon
			case "Akunanse": return Clan.Akunanse;
			case "Guruhi": return Clan.Guruhi;
			case "Ishtarri": return Clan.Ishtarri;
			case "Osebo": return Clan.Osebo;
			//Independents
			case "Gangrel": return Clan.Gangrel;
			case "Assamite": return Clan.Assamite;
			case "Followers of Set": return Clan.FollowersOfSet;
			case "Giovanni": return Clan.Giovanni;
			case "Ravnos": return Clan.Ravnos;
			case "Abomination": return Clan.Abomination;
			case "Baali": return Clan.Baali;
			case "Daughters of Cacophony": return Clan.DaughtersOfCacophony;
			case "Gargoyle": return Clan.Gargoyle;
			case "Nagaraja": return Clan.Nagaraja;
			case "Salubri": return Clan.Salubri;
			case "Samedi": return Clan.Samedi;
			case "TrueBrujah": return Clan.TrueBrujah;
			default: return Clan.UnknownClan;
		}
	}

	public static ReleaseSet GetReleaseSet( string release_set )
	{
		switch ( release_set )
		{
			case "AH": return ReleaseSet.AH;
			case "Anarchs": return ReleaseSet.Anarchs;
			case "BH": return ReleaseSet.BH;
			case "BL": return ReleaseSet.BL;
			case "CE": return ReleaseSet.CE;
			case "DS": return ReleaseSet.DS;
			case "FN": return ReleaseSet.FN;
			case "Gehenna": return ReleaseSet.Gehenna;
			case "Jyhad": return ReleaseSet.Jyhad;
			case "KMW": return ReleaseSet.KMW;
			case "LoB": return ReleaseSet.LoB;
			case "LotN": return ReleaseSet.LotN;
			case "NoR": return ReleaseSet.NoR;
			case "Promo": return ReleaseSet.Promo;
			case "Sabbat": return ReleaseSet.Sabbat;
			case "SoC": return ReleaseSet.SoC;
			case "SW": return ReleaseSet.SW;
			case "Tenth": return ReleaseSet.Tenth;
			case "Third": return ReleaseSet.Third;
			case "TR": return ReleaseSet.TR;
			case "VTES": return ReleaseSet.VTES;
			default: return ReleaseSet.UnkownReleaseSet;
		}
	}

	public static string GetReleaseSet( ReleaseSet release_set )
	{
		switch ( release_set )
		{
			case ReleaseSet.AH: return "AH";
			case ReleaseSet.Anarchs: return "Anarchs";
			case ReleaseSet.BH: return "BH";
			case ReleaseSet.BL: return "BL";
			case ReleaseSet.CE: return "CE";
			case ReleaseSet.DS: return "DS";
			case ReleaseSet.FN: return "FN";
			case ReleaseSet.Gehenna: return "Gehenna";
			case ReleaseSet.Jyhad: return "Jyhad";
			case ReleaseSet.KMW: return "KMW";
			case ReleaseSet.LoB: return "LoB";
			case ReleaseSet.LotN: return "LotN";
			case ReleaseSet.NoR: return "NoR";
			case ReleaseSet.Promo: return "Promo";
			case ReleaseSet.Sabbat: return "Sabbat";
			case ReleaseSet.SoC: return "SoC";
			case ReleaseSet.SW: return "SW";
			case ReleaseSet.Tenth: return "Tenth";
			case ReleaseSet.Third: return "Third";
			case ReleaseSet.TR: return "TR";
			case ReleaseSet.VTES: return "VTES";
			default: return "UnkownReleaseSet";
		}
	}

	public static string GetFriendlyReleaseSetName( ReleaseSet release_set )
	{
		switch ( release_set )
		{
			case ReleaseSet.AH: return "Ancient Hearts";
			case ReleaseSet.Anarchs: return "Anarchs";
			case ReleaseSet.BH: return "Black Hand";
			case ReleaseSet.BL: return "Bloodlines";
			case ReleaseSet.CE: return "Camarilla Edition";
			case ReleaseSet.DS: return "Dark Sovereigns";
			case ReleaseSet.FN: return "Final Nights";
			case ReleaseSet.Gehenna: return "Gehenna";
			case ReleaseSet.Jyhad: return "Jyhad";
			case ReleaseSet.KMW: return "Kindred Most Wanted";
			case ReleaseSet.LoB: return "Legacies of Blood";
			case ReleaseSet.LotN: return "Lords of the Night";
			case ReleaseSet.NoR: return "Nights of Reckoning";
			case ReleaseSet.Promo: return "Promo";
			case ReleaseSet.Sabbat: return "Sabbat";
			case ReleaseSet.SoC: return "Sword of Caine";
			case ReleaseSet.SW: return "Sabbat War";
			case ReleaseSet.Tenth: return "Tenth Anniversary";
			case ReleaseSet.Third: return "Third Edition";
			case ReleaseSet.TR: return "Twilight Rebellion";
			case ReleaseSet.VTES: return "Vampire: The Eternal Struggle";
			default: return "UnkownReleaseSet";
		}
	}

	public static Title GetTitle( string title )
	{
		switch ( title )
		{
			//Camarilla Titles
			case "primogen": return Title.Primogen;
			case "prince": return Title.Prince;
			case "justicar": return Title.Justicar;
			case "InnerCircle": return Title.InnerCircle;
			//Sabbat Titles
			case "bishop": return Title.Bishop;
			case "archbishop": return Title.Archbishop;
			case "cardinal": return Title.Cardinal;
			case "regent": return Title.Regent;
			case "priscus": return Title.Priscus;
			//Independent Titles
			case "1 vote": return Title.OneVote;
			case "2 votes": return Title.TwoVotes;
			case "3 votes": return Title.ThreeVotes;
			case "baron": return Title.Baron;
			//Laibon Titles
			case "magaji": return Title.Magaji;
			default: return Title.NoTitle;
		}
	}
}